package com.nys.conci.base.componentes.seguridad;


import com.nys.conci.base.utilitario.JSFUtil;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.NavigationCase;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;

/**
 * Clase encargada de servir de contralodor de navegación, cada vez, que se navegue en 
 * el sistema esta clase se encargada de administrar esa navegación. 
 * Es utilizada, para el bitacoreo de navegación, así como también para la redirección
 * de pantallas y el paso de parámetros.
 * 
 * @author Adam M. Gamboa González
 * 
 * @since 24 de Abril de 2012
 */
public class ControladorNavegacion extends ConfigurableNavigationHandler{
    
    private NavigationHandler padre;
    
    /**
     * Constructor
     * @param p 
     */
    public ControladorNavegacion(NavigationHandler p){
        this.padre = p;
    }
    
    /**
     * Método encargado de la navegación.
     * 
     * @param context Contexto de JSF
     * @param fromAction Metodo/action que ejecuto la navegación
     * @param outcome Regla de Navegación.
     */
    @Override
    public void handleNavigation(FacesContext context, String fromAction, String outcome) {
        
        String navegacion = outcome;
        if(navegacion != null){
            navegacion+="?faces-redirect=true";
            Map<String, String> parametros = JSFUtil.obtenerParametrosRequest();
            for(Entry<String, String> parametro : parametros.entrySet()){
                String key = parametro.getKey();               
            }
        }
        try{
            //Navego normalmente
            this.padre.handleNavigation(context, fromAction, navegacion);
        }catch(Exception ex){}
    }

    /**
     * Método implementado por requirimiento de la clase padre, lo que hace es llamar
     * al método de padre.
     * 
     * @param context Contexto de Java Server Faces
     * @param fromAction Metodo/action que ejecuto la navegación
     * @param outcome Regla de Navegación.
     * @return Caso de Navegación
     */
    @Override
    public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) {
         if (padre instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) padre).getNavigationCase(context, fromAction, outcome);
        } else {
            return null;
        }
    }

    /**
     * Método implementado por requirimiento de la clase padre, lo que hace es llamar
     * al método de padre.
     * 
     * @param context Contexto de Java Server Faces
     * @param fromAction Metodo/action que ejecuto la navegación
     * @param outcome Regla de Navegación.
     * @return Caso de Navegación
     */
    @Override
    public Map<String, Set<NavigationCase>> getNavigationCases() {
        if (padre instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) padre).getNavigationCases();
        } else {
            return null;
        }
    }
     
}
